package com.fingard.dsp.bank.directbank.chinapay01;

import com.fingard.constant.Format;
import com.fingard.dsp.bank.directConfig.ActSetItem;
import com.fingard.dsp.bank.directbank.PaymentState;
import com.fingard.dsp.bank.directbank.bankInterface.IH5Order;
import com.fingard.dsp.bank.reqrespobj.unifiedorder.ReqQueryOrder;
import com.fingard.dsp.bank.reqrespobj.unifiedorder.ReqUnifiedOrder;
import com.fingard.dsp.bank.reqrespobj.unifiedorder.RetAtsQueryOrder;
import com.fingard.dsp.bank.reqrespobj.unifiedorder.RetAtsUnifiedOrder;
import com.fingard.io.FileHelper;
import com.fingard.text.StringHelper;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 云闪付（银联手机WAP）支付渠道
 *
 * 参考文档：手机网页支付产品接口规范V2.2.pdf
 *
 * @author FanH
 * @date 2019/11/5
 */
public class ChinaPay01H5Order extends ChinaPay01Base implements IH5Order {
    /**
     * 开发接口：
     * 1. 6.2 消费类交易
     * 2. 6.5 交易状态查询交易
     */
    @Override
    public RetAtsUnifiedOrder submitH5Order(ReqUnifiedOrder p_req) {
        RetAtsUnifiedOrder retAts = new RetAtsUnifiedOrder();
        retAts.rdSeq = p_req.rdSeq;
        try {
            ActSetItem actItem = getBankConfig().getActSetItem(p_req.ownAct, "singPay");
            if (actItem == null || !FileHelper.existFile(actItem.ownKeyStorePath) || !FileHelper.existFile(actItem.oppCertFilePath)) {
                if (actItem == null) {
                    throw new Exception("未找到账号" + p_req.ownAct + "的批量商户配置节点");
                } else {
                    throw new Exception("账号" + p_req.ownAct + "的证书文件不存在");
                }
            }
            Map contentData = new HashMap();
            contentData.put("version", "5.1.0");//版本号 全渠道默认值
            contentData.put("encoding", getCharset());//字符集编码 可以使用UTF-8,GBK两种方式
            contentData.put("signMethod", "01");//签名方法
            contentData.put("txnType", "01");//交易类型 01:消费
            contentData.put("txnSubType", "01");//交易子类 01：消费
            contentData.put("bizType", "000201");//填写000201
            contentData.put("channelType", "08");//渠道类型 08手机
            contentData.put("backUrl", actItem.notifyURL);//后台通知地址
            contentData.put("accessType", "0");//接入类型，商户接入填0 ，不需修改（0：直连商户， 1： 收单机构 2：平台商户）
            contentData.put("merId", actItem.merchantId);//商户号码，请改成自己申请的商户号或者open上注册得来的777商户号测试
            contentData.put("orderId", p_req.rdSeq);//商户订单号，8-40位数字字母，不能含“-”或“_”，可以自行定制规则
            contentData.put("txnTime", Format.DateTime14Format.format(new Date()));//订单发送时间，取系统时间，格式为yyyyMMddHHmmss，必须取当前时间，否则会报txnTime无效
            contentData.put("accType", "01");//账号类型 01：银行卡02：存折03：IC卡帐号类型(卡介质)
            contentData.put("txnAmt", p_req.amount);//交易金额 单位为分，不能带小数点
            contentData.put("currencyCode", "156");

            Map<String, String> rspData = sendToBank(contentData, actItem, bankFront.getUrl("singPay"));
            String respCode = rspData.get("respCode");
            if ("00".equals(respCode)) {
                retAts.respCode = "0";
                retAts.rdSeq = rspData.get("queryId");
                retAts.transState = PaymentState.SUCCESS;
                retAts.payInfoCode = respCode + retAts.transState;
            } else {
                retAts.respCode = "-1";
                retAts.respInfo = rspData.get("respMsg");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
            retAts.respCode = "-1";
            retAts.respInfo = ex.getMessage();
            WriteBankLogLn(ex);
        }
        return retAts;
    }

    @Override
    public RetAtsQueryOrder queryH5Pay(ReqQueryOrder p_req) {
        RetAtsQueryOrder retAts = new RetAtsQueryOrder();
        retAts.rdSeq = p_req.rdSeq;
        try {
            ActSetItem actItem = getBankConfig().getActSetItem(p_req.ownAct, "");
            if (actItem == null || !FileHelper.existFile(actItem.ownKeyStorePath)
                    || !FileHelper.existFile(actItem.oppCertFilePath)) {
                if (actItem == null) {
                    throw new Exception("未找到账号" + p_req.ownAct + "的批量商户配置节点");
                } else {
                    throw new Exception("账号" + p_req.ownAct + "的证书文件不存在");
                }
            }
            Map contentData = new HashMap();
            contentData.put("version", "5.1.0");//版本号 全渠道默认值
            contentData.put("encoding", getCharset());//字符集编码 可以使用UTF-8,GBK两种方式
            contentData.put("signMethod", "01");//签名方法
            contentData.put("txnType", "01");//交易类型 01:消费
            contentData.put("txnSubType", "01");//交易子类 01：消费
            contentData.put("bizType", "000201");//填写000201
            contentData.put("accessType", "0");//接入类型，商户接入填0 ，不需修改（0：直连商户， 1： 收单机构 2：平台商户）
            contentData.put("merId", actItem.merchantId);//商户号码，请改成自己申请的商户号或者open上注册得来的777商户号测试
            contentData.put("txnTime", Format.DateTime14Format.format(new Date()));//订单发送时间，取系统时间，格式为yyyyMMddHHmmss，必须取当前时间，否则会报txnTime无效
            contentData.put("orderId", p_req.rdSeq);//商户订单号，8-40位数字字母，不能含“-”或“_”，可以自行定制规则

            Map<String, String> rspData = sendToBank(contentData, actItem, bankFront.getUrl("singPay"));
            String respCode = rspData.get("respCode");
            if ("00".equals(respCode)) {
                String origRespCode = rspData.get("origRespCode");
                if (StringHelper.hasAnyChar(origRespCode)) {
                    retAts.respCode = "0";
                    retAts.respInfo = rspData.get("origRespMsg");
                    retAts.transAmt = rspData.get("txnAmt");
                    retAts.transState = respCode;
                    retAts.payInfoCode = respCode;
                } else {
                    retAts.respCode = "-1";
                    retAts.respInfo = rspData.get("respMsg");
                }
            } else{
                retAts.respCode = "-1";
                retAts.respInfo = rspData.get("respMsg");;
            }

        } catch (Exception e) {
            retAts.respCode = "-1";
            retAts.respInfo = e.getMessage();
            e.printStackTrace();
        }
        return retAts;
    }
}
